﻿#include "cfgjsonrw.h"

#include <QFile>
#include <QCoreApplication>
#include <QFileInfo>
#include <QDir>

#include "common_log.h"

#define CONFIG_PATH "/config/robotCfg.json"

CfgJsonRW::CfgJsonRW()
{}

CfgJsonRW::~CfgJsonRW()
{}

static CfgJsonRW* instance = nullptr;

CfgJsonRW* CfgJsonRW::GetInstance()
{
	if (instance == nullptr) {
		instance = new CfgJsonRW();
	}
	return instance;
}

bool CfgJsonRW::Init()
{
	QString filename = QCoreApplication::applicationDirPath() + QString(CONFIG_PATH);
	QFile file(filename);
	if (!file.exists()) {
		QFileInfo f(file.fileName());
		auto path = f.absoluteDir().dirName();
		if (!QDir().mkpath(path)) {
			log_error("Create path[{}] filed", f.absoluteDir().dirName());
			return false;
		}
		return true;
	}
	if (!file.open(QIODevice::ReadOnly)) {
		log_error("file[{}] open failed", filename);
		return false;
	}

	QByteArray data = file.readAll();
	file.close();

	m_all.fromJson(data);
	return true;
}


bool CfgJsonRW::SaveCfg()
{
	QByteArray data = m_all.toByteArray(QJsonDocument::Indented);
	QString filename = QCoreApplication::applicationDirPath() + QString(CONFIG_PATH);
	QFile file(filename);
	if (file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
		int ret = file.write(data);
		file.close();
		if (ret > 0) {
			return true;
		} else {
			log_error("file write 0 Byte");
			return false;
		}
	}
	log_error("file[{}] open fialed", filename);
	return false;
}

QString CfgJsonRW::GetProjectName()
{
	return m_all.project();
}
bool CfgJsonRW::SetProjectName(const QString& name)
{
	m_all.project() = name;
	return SaveCfg();
}

WCSCfgJ CfgJsonRW::GetWCSCfg()
{
	return m_all.wcs();
}
bool CfgJsonRW::UpdateWCSCfg(const WCSCfgJ& cfg)
{
	m_all.wcs = cfg;
	return SaveCfg();
}

/*机械手配置*/
RobotJ CfgJsonRW::GetRobotCfg()
{
	return m_all.robot();
}
bool CfgJsonRW::UpdateRobotCfg(const RobotJ& cfg)
{
	m_all.robot = cfg;
	return SaveCfg();
}

JigCfg CfgJsonRW::GetJigCfg()
{
	return m_all.jig();
}

bool CfgJsonRW::SetJigCfg(const JigCfg& cfg)
{
	m_all.jig = cfg;
	return SaveCfg();
}

VisualJ CfgJsonRW::GetCameraCfg()
{
	return m_all.camera();
}
bool CfgJsonRW::UpdateCameraCfg(const VisualJ& cfg)
{
	m_all.camera = cfg;
	return SaveCfg();
}

/*码垛托盘*/
QStringList CfgJsonRW::GetAllStackPlateID()
{
	QStringList out;
	for (auto& iter : m_all.stackplate()) {
		out.append(iter.id());
	}
	return out;
}
StackPlateCfg CfgJsonRW::GetStackPlateCfgByID(const QString& id)
{
	for (auto& iter : m_all.stackplate()) {
		if (iter.id() == id) {
			return iter;
		}
	}
	return {};
}
bool CfgJsonRW::DeleteStackPlate(const QString& id)
{
	int i = 0;
	for (auto& iter : m_all.stackplate()) {
		if (iter.id() == id) {
			m_all.stackplate().removeAt(i);
			return true;
		}
		i++;
	}
	return false;
}
bool CfgJsonRW::UpdateStackPlateCfg(const StackPlateCfg& cfg)
{
	for (auto& iter : m_all.stackplate()) {
		if (iter.id() == cfg.id()) {
			iter = cfg;
			return true;
		}
	}
	m_all.stackplate().append(cfg);
	return true;
}

bool CfgJsonRW::SetAllStackPlateCfg(const QList<StackPlateCfg>& cfg)
{
	m_all.stackplate().clear();
	m_all.stackplate() = cfg;
	return SaveCfg();
}

PlateStackCfg CfgJsonRW::GetPlateStackCfg()
{
	return m_all.plateStack();
}
bool CfgJsonRW::UpdatePlateStackCfg(const PlateStackCfg& cfg)
{
	m_all.plateStack = cfg;
	return SaveCfg();
}

/*拆垛托盘配置*/
QStringList CfgJsonRW::GetAllUnstackPlateID()
{
	QStringList ret;
	for (auto& iter : m_all.unstackplate()) {
		ret.append(iter.id());
	}
	return ret;
}
UnstackPlateCfg CfgJsonRW::GetUnstackPlateCfgByID(const QString& id)
{
	for (auto& iter : m_all.unstackplate()) {
		if (iter.id() == id) {
			return iter;
		}
	}
	return {};
}
bool CfgJsonRW::DeleteUnstackPlate(const QString& id)
{
	int i = 0;
	for (auto& iter : m_all.unstackplate()) {
		if (iter.id() == id) {
			m_all.unstackplate().removeAt(i);
			return true;
		}
		i++;
	}
	return false;
}
bool CfgJsonRW::UpdateUnstackPlateCfg(const UnstackPlateCfg& cfg)
{
	for (auto& iter : m_all.unstackplate()) {
		if (iter.id() == cfg.id()) {
			iter = cfg;
			return true;
		}
	}
	m_all.unstackplate().append(cfg);
	return true;
}

bool CfgJsonRW::SetAllUnstackPlateCfg(const QList<UnstackPlateCfg>& cfg)
{
	m_all.unstackplate().clear();
	m_all.unstackplate() = cfg;
	return SaveCfg();
}

/*输送线配置*/
QStringList CfgJsonRW::GetAllBoxlineID()
{
	QStringList ret;
	for (auto& iter : m_all.boxline()) {
		ret.append(iter.id());
	}
	return ret;
}
BoxlineCfg CfgJsonRW::GetBoxlineCfgByID(const QString& id)
{
	for (auto& iter : m_all.boxline()) {
		if (iter.id() == id) {
			return iter;
		}
	}
	return {};
}
bool CfgJsonRW::DeleteBoxline(const QString& id)
{
	int i = 0;
	for (auto& iter : m_all.boxline()) {
		if (iter.id() == id) {
			m_all.boxline().removeAt(i);
			return true;
		}
		i++;
	}
	return false;
}
bool CfgJsonRW::UpdateBoxlineCfg(const BoxlineCfg& cfg)
{
	for (auto& iter : m_all.boxline()) {
		if (iter.id() == cfg.id()) {
			iter = cfg;
			return true;
		}
	}
	m_all.boxline().append(cfg);
	return true;
}

bool CfgJsonRW::SetAllBoxlineCfg(const QList<BoxlineCfg>& cfg)
{
	m_all.boxline().clear();
	m_all.boxline() = cfg;
	return SaveCfg();
}

/*业务线配置*/
QStringList CfgJsonRW::GetAllPipelineID()
{
	QStringList ret;
	for (auto& iter : m_all.pipeline()) {
		ret.append(iter.id());
	}
	return ret;
}
PipelineCfg CfgJsonRW::GetPipelineCfgByID(const QString& id)
{
	for (auto& iter : m_all.pipeline()) {
		if (iter.id() == id) {
			return iter;
		}
	}
	return {};
}
bool CfgJsonRW::DeletePipeline(const QString& id)
{
	int i = 0;
	for (auto& iter : m_all.pipeline()) {
		if (iter.id() == id) {
			m_all.pipeline().removeAt(i);
			return true;
		}
		i++;
	}
	return false;
}
bool CfgJsonRW::UpdatePipelineCfg(const PipelineCfg& cfg)
{
	for (auto& iter : m_all.pipeline()) {
		if (iter.id() == cfg.id()) {
			iter = cfg;
			return true;
		}
	}
	m_all.pipeline().append(cfg);
	return SaveCfg();
}

bool CfgJsonRW::SetAllPipelineCfg(const QList<PipelineCfg>& cfg)
{
	m_all.pipeline().clear();
	m_all.pipeline() = cfg;
	return SaveCfg();
}

/*业务线路径*/
QStringList CfgJsonRW::GetAllPipelinePathID(const QString& pipe)
{

	return {};
}
PathCfg CfgJsonRW::GetPipelinePathCfgByID(const QString& pipe, const QString& id)
{
	return {};
}
bool CfgJsonRW::DeletePipelinePath(const QString& pipe, const QString& id)
{

	return false;
}
bool CfgJsonRW::UpdatePipelinePathCfg(const QString& pipe, const PathCfg& cfg)
{

	return false;
}

QStringList CfgJsonRW::GetPathIDList()
{
	QStringList id;
	auto& paths = m_all.path();
	for (auto& iter : paths) {
		id.append(iter.name());
	}

	return id;
}
PathCfg CfgJsonRW::GetPathCfgById(const QString& id)
{
	for (auto& iter : m_all.path()) {
		if (iter.name() == id) {
			return iter;
		}
	}
	return {};
}
bool CfgJsonRW::SaveAllPath(const QList<PathCfg>& cfgs)
{
	m_all.path = cfgs;
	return SaveCfg();
}


QList<GratingJ> CfgJsonRW::GetGratingCfg()
{
	return m_all.safeHW().grating();
}
bool CfgJsonRW::SaveGratingCfg(const QList<GratingJ>& cfg)
{
	m_all.safeHW().grating() = cfg;
	return SaveCfg();
}

AlarmJ CfgJsonRW::GetAlarmLightCfg()
{
	return m_all.safeHW().alarm();
}
bool CfgJsonRW::SaveAlarmLightCfg(const AlarmJ& cfg)
{
	m_all.safeHW().alarm() = cfg;
	return SaveCfg();
}

/*安全锁配置*/
SafeLockJ CfgJsonRW::GetSafeLockerCfg()
{
	return m_all.safeHW().safelock();
}
bool CfgJsonRW::SaveSafeLockerCfg(const SafeLockJ& cfg)
{
	m_all.safeHW().safelock() = cfg;
	return SaveCfg();
}

/*安全门配置*/
SafeDoorJ CfgJsonRW::GetSafeDoorCfg()
{
	return m_all.safeHW().safedoor();
}

bool CfgJsonRW::SaveSafeDoorCfg(const SafeDoorJ& cfg)
{
	m_all.safeHW().safedoor() = cfg;
	return SaveCfg();
}
